// 定义栈的数据结构，请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中，调用 min、push 及 pop 的时间复杂度都是 O(1)。

#include<bits/stdc++.h>
using namespace std;

// vector模拟stack，imin记录最小


// 执行用时：
// 20 ms
// , 在所有 C++ 提交中击败了
// 77.40%
// 的用户
// 内存消耗：
// 14.6 MB
// , 在所有 C++ 提交中击败了
// 96.47%
// 的用户


class MinStack {
public:
    /** initialize your data structure here. */
    vector<int> sta1;
    int imin = INT_MAX;
    MinStack() {

    }
    
    void push(int x) {
        sta1.emplace_back(x);
        if(x<imin){
            imin = x;
        }
    }
    
    void pop() {
        int num = sta1.back();
        sta1.erase(sta1.end()-1);
        if(sta1.size()>0){
            if(num==imin){
                imin = INT_MAX;
                for(int i=0;i<sta1.size();++i){
                    imin = std::min(imin,sta1[i]);
                }
            }
        }
        else{
            imin = INT_MAX;
        }
        
    }
    
    int top() {
        if(sta1.size()>0){
            return sta1.back();
        }
        return INT_MIN;
    }
    
    int min() {
        return imin;
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */